import { h } from 'vue';
import { formatValue } from './table-utils'
import * as elComps from 'element-plus'



// ------ render
const mateRegRule = /#{(.+?)\}/;
const mateRegRules = /#{(.+?)\}/g;
/**
 * 一个超链接渲染超链接的方法
 * 1 网址
 * linkUrl: http://www.baidu.com
 * 2 路由地址
 * linkUrl: /home
 *
 * 参数解析：
 *  示例1：http://www.baidu.com?id=#{id}&name=#{name}
 *  示例2：/home?id=#{id}&name=#{name}
 *
 * @param {Object} param { row, column }
 * @param {Object} extParams 其他参数
 * @returns String | Dom
 */
export const linkUrlRender = ({ row, column }, extParams) => {
  const { format, linkUrl } = extParams
  const cellValue = row[column.field]
  const finallValue = formatValue(cellValue, format)
  if (linkUrl && cellValue) {
    let finalLinkUrl = linkUrl
    const marks = finalLinkUrl.match(mateRegRules);
    if (marks) {
      const markKeys = marks.map(item => item.match(mateRegRule)[1]);
      markKeys.forEach(key => { finalLinkUrl = finalLinkUrl.replace(mateRegRule, row[key] || '') });
    }
    return [
      <a class='rk-grid-row-link' target='_blank' rel='noopener' href={finalLinkUrl}>
        {finallValue}
      </a>
    ]
  } else {
    return finallValue
  }
}

/**
 * 字段渲染的方法
 * 
 * @param {Object} params 参数信息
 * @param {Object} col 字段配置
 * @returns 
 */
export const columnRender = (params, col) => {
  const { row, column } = params;
  const cellValue = row[column.field];
  if (!col.renderFunc) return cellValue
  try {
    const exceFn = new Function('h', 'params', 'components', col.renderFunc.replace('func:', ''))
    const result = exceFn(h, { cellValue, ...params }, elComps)
    return result
  } catch (error) {
    console.error('执行字段渲染函数出错！', error)
    return null
  }
}

/**
 * 字段格式化的方法：优先级 格式化函数 > 格式化规则
 * 
 * @param {Object} params 参数信息
 * @param {Object} col 字段配置
 * @returns 
 */
export const columnFormatter = (params, col) => {
  const { cellValue } = params
  // 存在格式化函数
  if (col.formatFunc) {
    try {
      const exceFn = new Function('params', col.formatFunc.replace('func:', ''))
      const result = exceFn.call(this, params)
      return result
    } catch (error) {
      console.error('执行字段格式化函数出错！', error)
      return cellValue
    }
  }
  // 存在格式化规则
  if (col.formatRule) {
    return formatValue(cellValue, col.formatRule)
  }
  return cellValue
}

